package com.neuedu.first;

import java.io.*;

public class CharIOTestDriver {
    public static void main(String[] args) {
        test02();
    }

    /**
     * 字符流的应用：带有buffer的输入输出流
     */
    private static void test02() {
        try {
            // 创建一个文件输入流对象,第二个参数指定的编码格式
            BufferedReader fis = new BufferedReader(
                    new InputStreamReader(
                            new FileInputStream(
                                    new File("E:\\demo\\temp\\test\\filein01.txt")), "UTF-8"));
            // 创建一个文件输出流对象
            // 注意：第二个参数默认是false，表示每次从文件的开头开始写入内容，也就是覆盖写；
            //       如果第二个参数是true，表示每次从文件的末尾开始写，也就是末尾追加写；
            BufferedWriter fos = new BufferedWriter(
                    new OutputStreamWriter(
                            new FileOutputStream("E:\\demo\\temp\\test\\filein01_out20190222_2.txt", true),"UTF-8"));


            // 将文件流对象中的内容读取到程序中
            String strLine = fis.readLine();
            // 判断是否读取到文件末尾
            while (strLine != null) {
                // 输出读取的内容
                System.out.println(strLine);
                // 使用文件输出流对象，将内容写出到指定文件中
                fos.write(strLine);
                // BufferedWriter写出内容末尾没有换行符，需要手动为每一行内容写出一个换行符
                //fos.write("\n");
                fos.newLine();// 写一个换行符

                // 继续向下读取内容(否则，进入死循环)
                strLine = fis.readLine();
            }

            // 关闭资源
            // 也可以写在finally部分进行资源回收
            if (fis != null) {
                fis.close();
            }
            // 清空输出流
            if (fos != null) {
                fos.flush();
                fos.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 字符流的应用：文件输入流
     */
    private static void test01() {
        try {
            // 创建一个文件输入流对象,第二个参数指定的编码格式
            InputStreamReader fis =
                    new InputStreamReader(
                            new FileInputStream(new File("E:\\demo\\temp\\iotest\\filein01.txt")), "UTF-8");
            // 创建一个文件输出流对象
            // 注意：第二个参数默认是false，表示每次从文件的开头开始写入内容，也就是覆盖写；
            //       如果第二个参数是true，表示每次从文件的末尾开始写，也就是末尾追加写；
            OutputStreamWriter fos = new OutputStreamWriter(
                    new FileOutputStream("E:\\demo\\temp\\iotest\\filein01_out20190222.txt", true),"UTF-8");

            // 创建一个读取文件输入流中的流数据的容器数组
            char[] chars = new char[1024];
            // 将文件流对象中的内容读取到程序中
            int len = fis.read(chars);
            // 判断是否读取到文件末尾
            while (len != -1) {
                // 输出读取的内容
                String strLine = new String(chars,0,len);
                System.out.println(strLine);
                // 使用文件输出流对象，将内容写出到指定文件中
                fos.write(chars, 0, len);

                // 重新清理读取的容器数组
                //chars = new char[1024];
                // 继续向下读取内容(否则，进入死循环)
                len = fis.read(chars);
            }
            // 文件输出流写完之后，在文件默认追加一个换行符；
            //fos.write('\n');
            fos.write("\n".toCharArray());

            // 关闭资源
            // 也可以写在finally部分进行资源回收
            if (fis != null) {
                fis.close();
            }
            // 清空输出流
            if (fos != null) {
                fos.flush();
                fos.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
